<html>
<head>
<title>Remake de Fruity Frank - Version 0.23</title>
<style type="text/css">
span {
	font-family: 'Courier New';
	font-size: 10pt;
	color: #000000;
}
.SpanClass0 {
	color: #808080;
}
.SpanClass3 {
	color: #008080;
}
.SpanClass5 {
	font-weight: bold;
	color: #0000FF;
}
.SpanClass7 {
	color: #808080;
}
.SpanClass10 {
	font-weight: bold;
	color: #000080;
}
.SpanClass11 {
}
</style>
</head>
<body bgcolor="#FFFFFF">
<h2>Remake (parcial) de Fruity Frank... 23 - Un movimiento del personaje m&aacute;s suave</h2>
<p align="right">(Volver al <a href="doc.html">&iacute;ndice</a>) </p>



<p>Para hacer que el movimiento del personaje sea m&aacute;s suave, la soluci&oacute;n puede ser no sumar 40 a su coordenada X cada ver que se pulse la tecla &quot;derecha&quot; (por ejemplo), sino aumentar poco a poco hasta llegar a esos 40. Aun as&iacute;, cuando pulsemos la tecla &quot;derecha&quot;, su posici&oacute;n deber&aacute; seguir aumentando durante varios &quot;fotogramas&quot; del juego, por lo que podemos usar una variable booleana para comprobar si estamos en medio de un movimiento:</p>

<p>Algunos de los atributos, que antes eran</p>

<pre><code>    // El personaje se mover&aacute; de 1 en 1 casilla,
    // cuando se pulse cada tecla
    incrX = 41; 
    incrY = 34;</code></pre>  

<p>ahora podr&iacute;an ser</p>

<pre><code>    // El personaje se mover&aacute; de varios en varios pixeles
    // cuando se pulse cada tecla
    anchoCasilla = 41; 
    altoCasilla = 34;
    incrX = 4; 
    incrY = 4;
    enMovimiento = false;</code></pre>  

<p>Y la rutina de mover a la derecha, que antes era</p>

<pre><code>    public  void MoverDerecha()
    {
      if (miJuego.GetNivelActual().EsPosibleMover( (short) (x+incrX), y) ) 
      {
        CambiarDireccion(DERECHA);
        SiguienteFotograma();
        x += incrX;
        miJuego.GetMarcador().IncrPuntuacion( 
          miJuego.GetNivelActual().PuntosMover( x, y ));
      }
    } </code></pre>  

<p>ahora podr&iacute;a modificarse as&iacute;</p>

<pre><code>    public  void MoverDerecha()
    {
      if (enMovimiento)  // Si ya est&aacute; en movimiento, salgo
        return;
      if (miJuego.GetNivelActual().EsPosibleMover( (short) (x+anchoCasilla), y) ) 
      {
        CambiarDireccion(DERECHA);
        enMovimiento = true;
        incrXActual = incrX; incrYActual = 0;
        xFinal = (short)(x+anchoCasilla); yFinal = y;
        miJuego.GetMarcador().IncrPuntuacion( 
          miJuego.GetNivelActual().PuntosMover( (short) (x+anchoCasilla), y ));
      }
    }</code></pre>  
    

<p>Es decir, pone en marcha el movimiento (enMovimiento = true), calcula los incrementos que se van a usar para desplazarse y la posici&oacute;n final, suma puntos... pero deja los movimientos intermedios a otra funci&oacute;n, que podr&iacute;a llamarse &quot;Mover&quot;, que se llamar&iacute;a desde &quot;SiguienteFotograma&quot; (en el juego), y que podr&iacute;a ser as&iacute;:</p>

<pre><code>    public new void Mover()
    {
      if (!enMovimiento)  // Si no est&aacute; en movimiento, no hay que hacer nada
        return;
      SiguienteFotograma();
      x += incrXActual;      // Aumento otro poco la posici&oacute;n
      y += incrYActual;
       // Compruebo si me paso (ancho y salto pueden no ser proporcionales)
      if ((incrXActual &gt; 0 ) &amp;&amp; (x &gt;= xFinal))  
        x = xFinal;
      if ((incrXActual &lt; 0 ) &amp;&amp; (x &lt;= xFinal))  
        x = xFinal;
      if ((incrYActual &gt; 0 ) &amp;&amp; (y &gt;= yFinal))  
        y = yFinal;
      if ((incrYActual &lt; 0 ) &amp;&amp; (y &lt;= yFinal))  
        y = yFinal;  
      // Compruebo si ya he avanzado toda la casilla, para dejar de mover  
      if ((x == xFinal) &amp;&amp; (y == yFinal)) 
        enMovimiento = false;
    } </code></pre>  
    
<p>Esta funci&oacute;n aumenta la posici&oacute;n seg&uacute;n los incrementos previstos, comprueba que no nos hayamos pasado (porque el incremento puede no ser un divisor exacto del ancho de la casilla), y marca el movimiento como terminado cuando corresponda.</p>


<p><br />De paso, en esta versi&oacute;n he mejorado un poco los gr&aacute;ficos, conservando la est&eacute;tica inicial y los 16 colores originales, pero con puntos algo m&aacute;s peque&ntilde;os para que las im&aacute;genes sean m&aacute;s n&iacute;tidas. Las im&aacute;genes originales siguen estando disponibles en una subcarpeta, de forma que en la versi&oacute;n definitiva del juego se podr&iacute;a permitir incluso al usuario escoger si quiere usar los gr&aacute;ficos originales del juego o una est&eacute;tica ligeramente revisada.</p>

<p>Como es habitual, todo el fuente del proyecto est&aacute; en: <a href="http://code.google.com/p/fruityfrank"> code.google.com/p/fruityfrank</a></p>
<p align="right">(Volver al <a href="doc.html">&iacute;ndice</a>) </p>
</body>
</html>
